﻿//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Licensed under the MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////
#include "GbmpParameterUCSList.h"
#include "IUserCoordinateSystem.h"
#include "IParameterValueStorage.h"
#include "UniIdentity.h"
#include "IDocument.h"
#include "IElement.h"
#include "IParameterValueElementId.h"
#include "IElementBasicInformation.h"
#include "IElementPositionReportComponent.h"
#include "GbmpDocUtils.h"

#include "EnableCompileWarning_The_LAST_IncludeInCpp.h"
using namespace gcmp;

DATA_DEFINE(GbmpParameterUCSList)
{
}

GbmpParameterUCSList::GbmpParameterUCSList(const UniIdentity& uid)
    : GbmpParameterValueListBase(uid)
{
}

OwnerPtr<IParameterValueList> GbmpParameterUCSList::Clone() const
{
    return NEW_AS_OWNER_PTR(GbmpParameterUCSList, *this);
}

std::wstring GbmpParameterUCSList::OnGetDisplayStringByValue(const IDocument* pDoc, const IParameterValueStorage* pValue) const
{
    std::wstring res;
    DBG_WARN_AND_RETURN_UNLESS(pDoc, res, L"pDoc为空",L"GDMPLab",L"2024-03-30");
    DBG_WARN_AND_RETURN_UNLESS(pValue, res, L"pValue为空",L"GDMPLab",L"2024-03-30");

    const IParameterValueElementId* pElementId = dynamic_cast<const IParameterValueElementId*>(pValue);
    DBG_WARN_AND_RETURN_UNLESS(pElementId, res, L"pElementId为空",L"GDMPLab",L"2024-03-30");

    if (!pElementId->GetValue().IsValid())
    {
        return GbmpParameterValueListBase::s_nullName;
    }
    const IUserCoordinateSystem* pUcs = quick_cast<IUserCoordinateSystem>(pDoc->GetElement(pElementId->GetValue()));
    if (pUcs)
    {
        DBG_WARN_AND_RETURN_UNLESS(pUcs->GetBasicInformation(), res, L"pUcs->GetBasicInformation()为空",L"GDMPLab",L"2024-03-30");
        return pUcs->GetBasicInformation()->GetName();
    }

    return res;
}


std::vector<OwnerPtr<IParameterValueStorage>> GbmpParameterUCSList::OnGetValues(const IDocument* pDoc, const std::vector<ElementId>& ids/* = std::vector<ElementId>()*/) const
{
    std::vector<OwnerPtr<IParameterValueStorage>> res;
    DBG_WARN_AND_RETURN_UNLESS(pDoc, res, L"pDoc为空",L"GDMPLab",L"2024-03-30");

    std::vector<IUserCoordinateSystem*> allUcs = IUserCoordinateSystem::GetAllUserCoordinateSystem(pDoc);
    for (std::size_t i = 0; i < allUcs.size(); ++i)
    {
        res.emplace_back(IParameterValueElementId::Create(allUcs[i]->GetElementId()));
    }
    return res;
}
